跳到主要内容

Shell 脚本进行数学运算

注意:letexpr 命令已经过时了,不要再使用,而 $[ operation ] 的方式则已经废弃了,现在数学运算只需简单的使用 $(( 表达式 )) 就行了,双括号命令允许使用高级数学表达式。

如下所示

#!/bin/bash

val=$((2 + 2))
echo "两数之和为 : $val"

执行脚本,输出结果如下所示:

两数之和为 : 4

实例:

#!/bin/bash

a=10
b=20

# 在算数表达式中,变量前面无需加 $
val=$((a + b))
echo "a + b : $val"

val=$((a - b))
echo "a - b : $val"

val=$((a * b))
echo "a * b : $val"

val=$((b / a))
echo "b / a : $val"

val=$((b % a))
echo "b % a : $val"

if [ $a == $b ]
then
echo "a 等于 b"
fi
if [ $a != $b ]
then
echo "a 不等于 b"
fi

执行脚本,输出结果如下所示:

a + b : 30
a - b : -10
a * b : 200
b / a : 2
b % a : 0
a 不等于 b

bc 工具(浮点运行、进制转换)

上面的命令都只能用于整形运行,无法支持浮点型,下面使用 bc 来处理浮点型,bc 是一个用于数学运算的高级实用工具,这个精密的计算器包含了大量的选项。

$ echo "4 * 0.52" | bc
2.08

设定小数精度

$ echo "scale=2;22/7" | bc
3.14

进制转换

用 bc 可以将一种进制系统转换为另一种

#!/bin/bash

no=100
echo "obase=2;${no}" | bc
no=1100100
echo "obase=10;ibase=2;${no}" | bc

输出

1100100
100

上面适用于较短的运算,但如果需要进行大量运算,在一个命令行中列出多个表达式就会有点麻烦。

有一个方法可以解决这个问题。bc 命令能识别输入重定向,所以使用内联输入重定向

#!/bin/bash

var1=10.46
var2=43.67
var3=33.2
var4=71
var5=$(bc << EOF
scale = 4
a1 = ($var1 * $var2)
b1 = ($var3 * $var4)
a1 + b1
EOF
)
echo The final answer for this mess is $var5

输出:

The final answer for this mess is 2813.9882